#include "stc8h.h"
#include "intrins.h"
#include "../main/configuration.h"
#include "../ADC/ADC.h"
#include "../LED/LED.h"

#define ADC_POWER   0x80
#define ADC_START   0x40
#define ADC_FLAG    0x20
#define ADC_EPWMT   0x10

const unsigned long int code NTC[100]=    //阻值表 单位0.1Ω
{           
1626337	,     //	0
1546084	,     //	1
1470244	,     //	2
1398550	,     //	3
1330755	,     //	4
1266624	,     //	5
1205940	,     //	6
1148500	,     //	7
1094112	,     //	8
1042600	,     //	9
993794	,     //	10
947539	,     //	11
903689	,     //	12
862105	,     //	13
822660	,     //	14
785231	,     //	15
749705	,     //	16
715976	,     //	17
683944	,     //	18
653514	,     //	19
624599	,     //	20
597115	,     //	21
570985	,     //	22
546134	,     //	23
522494	,     //	24
500000	,     //	25
478590	,     //	26
458208	,     //	27
438797	,     //	28
420308	,     //	29
402693	,     //	30
385905	,     //	31
369901	,     //	32
354642	,     //	33
340089	,     //	34
326205	,     //	35
312958	,     //	36
300315	,     //	37
288244	,     //	38
276719	,     //	39
265711	,     //	40
255194	,     //	41
245146	,     //	42
235542	,     //	43
226360	,     //	44
217581	,     //	45
209185	,     //	46
201153	,     //	47
193467	,     //	48
186112	,     //	49
179072	,     //	50
172331	,     //	51
165876	,     //	52
159693	,     //	53
153769	,     //	54
148093	,     //	55
142653	,     //	56
137438	,     //	57
132437	,     //	58
127642	,     //	59
123042	,     //	60
118629	,     //	61
114395	,     //	62
110331	,     //	63
106430	,     //	64
102684	,     //	65
99087	,     //	66
95633	,     //	67
92314	,     //	68
89125	,     //	69
86061	,     //	70
83115	,     //	71
80284	,     //	72
77561	,     //	73
74943	,     //	74
72424	,     //	75
70002	,     //	76
67671	,     //	77
65427	,     //	78
63268	,     //	79
61189	,     //	80
59188	,     //	81
57260	,     //	82
55404	,     //	83
53616	,     //	84
51893	,     //	85
50233	,     //	86
48632	,     //	87
47090	,     //	88
45603	,     //	89
44169	,     //	90
42787	,     //	91
41453	,     //	92
40166	,     //	93
38925	,     //	94
37727	,     //	95
36572	,     //	96
35456	,     //	97
34379	,     //	98
33339         //    99
};	  

void delay()
{
    unsigned int data i;
    for (i=0; i<100; i++);
}

void ADC_init()                                       //初始化adc，使能pwm触发adc
{
    P1M0 &= 0xfe;
    P1M1 |= 0x01;
    

    P_SW2 |= 0x80;
    ADCTIM = 0x3f;                              //设置ADC内部时序
    P_SW2 &= 0x7f;
    ADCCFG = 0x0f;                              //设置ADC时钟为系统时钟/2/16
    ADCEXCFG |= 0x03;                           //设置adc转换16次取平均值
    ADC_CONTR = 0x80;                           //使能ADC模块

}


void adc_convert()
{
        ADC_CONTR |= 0x40;                      //启动AD转换
        _nop_();
        _nop_();
        while (!(ADC_CONTR & 0x20));            //查询ADC完成标志
        ADC_CONTR &= ~0x20;                     //清完成标志
}

unsigned int read_temp()                                 //读取温度并返回
{


    unsigned long int data res_ntc_resis;
    unsigned int data res_adc;
    unsigned long int data res_temp;

    adc_convert();


    res_adc=(ADC_RES<<2)+(ADC_RESL>>6);            //adc结果计算   1024分辨率
    if(res_adc==0){res_ntc_resis=0xffffffff;}else{
    res_ntc_resis=resis*(1024-res_adc)/res_adc;}        //ntc电阻值计算   单位0.1Ω

    if (res_ntc_resis<=NTC[50])                     //匹配ntc电阻值，查表得到温度数值，取大值
    {
        
        char i;
        if(res_ntc_resis<=NTC[99]){res_temp=99;}else{
            for (i=99;i>=50;i-- )
            {
    
                    if(res_ntc_resis<=NTC[i])
                    {
                        res_temp=i;
                        break;
                    }

                
            }
        }
    }
    else
    {
        
        char i;
        if(res_ntc_resis>=NTC[0]){res_temp=0;}else{
        for (i=49;i>=0;i--)
            {
                if(res_ntc_resis<=NTC[i])
                {
                    res_temp=i;
                    break;
                }
            }
        }
    }
    return res_temp;
}

void ADC_ISR() interrupt 5                          //adc中断服务函数
{
    ADC_CONTR &= ~ADC_FLAG;
}


